#ifndef TIMER_WHEEL_H
#define TIMER_WHEEL_H

#include <cstdint>
#include <array>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>

// 回调函数类型定义
typedef void (*cb)(void* puser);

// 定时任务元素结构
struct TimerElem {
    cb callback;         // 回调函数
    void* puser;         // 用户数据
    uint64_t interval;   // 周期时间（0表示一次性任务）
    uint64_t expire;     // 到期时间戳
    TimerElem* next;     // 链表指针
};

class TimerWheel
{
public:
    // 定义层级数量和每个层级的槽位数量
    static const int WHEEL_LEVELS = 4;    // 4层级时间轮
    static const int SLOT_COUNT = 256;    // 每个层级256个槽位

    TimerWheel();
    ~TimerWheel();

    // 添加定时任务
    void addTimer(cb callback, void* puser, uint64_t interval);
    
    // 时间滴答，每调用一次代表时间推进一个单位
    void tick();

private:
    uint64_t timeticket;                  // 时间戳计数器
    std::array<std::array<TimerElem*, SLOT_COUNT>, WHEEL_LEVELS> wheels;  // 4层时间轮

    // 线程相关成员
    std::thread worker;                   // 工作线程
    std::mutex queueMutex;                // 队列互斥锁
    std::condition_variable cv;           // 条件变量
    std::queue<TimerElem*> taskQueue;     // 待执行任务队列
    bool running;                         // 线程运行标志

    // 工作线程函数
    void workerThread();
    
    // 级联迁移函数，将高层级任务迁移到低层级
    void cascade(uint8_t level, uint8_t slot);
};

#endif // TIMER_WHEEL_H
